package net.suplementos.web.action;

import java.util.List;

import net.suplementos.negocio.CadastroDelegate;
import net.suplementos.negocio.ControleDelegate;
import net.suplementos.pojo.Estoque;
import net.suplementos.pojo.Lote;
import net.suplementos.pojo.Produto;
import net.suplementos.servico.CadastroServico;
import net.suplementos.servico.ControleServico;
import net.suplementos.web.LocalConstantes;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/cadastrarEstoque")
@InterceptorRefs({
	@InterceptorRef(value = "store", params = {"operationMode", "AUTOMATIC"}),
	@InterceptorRef("defaultStack")
})
public class CadastrarEstoqueAction extends ActionSupport {
	
	private Estoque estoque;
	private Produto produto;
	private Lote lote;

	private List<Lote> lotes;

	private ControleServico controleServico = ControleDelegate.getInstance();
	private CadastroServico cadastroServico = CadastroDelegate.getInstance();

	private static final String FORWARD_NOTIFICACAO = "notificacaoProduto";
	
	private String origem = "";

	@Action(value = "estoque", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CONTROLE_CADASTRAR_ESTOQUE + "/estoque.jsp") 
	})
    public String estoque() throws Exception {
		setProduto(cadastroServico.getProduto(getProduto().getId()));
		setEstoque(controleServico.getOuCriaEstoque(getProduto()));
		setLotes(controleServico.listarLotesEstoque(getEstoque()));

        return SUCCESS;
    }

	@Action(value = "abrirIncluirLote", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CONTROLE_CADASTRAR_ESTOQUE + "/incluirLote.jsp") 
	})
	public String abrirIncluirLote() throws Exception {
		return SUCCESS;
	}

	@Action(value = "confirmarInclusaoLote", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CONTROLE_CADASTRAR_ESTOQUE + "/confirmarInclusaoLote.jsp") 
	})
	public String confirmarInclusaoLote() throws Exception {
		return SUCCESS;
	}
	
	@Action(value = "incluirLote", results = {
		@Result(name = SUCCESS, params = {
			"actionName", "estoque", 
			"produto.id", "${lote.estoque.id}"
		}, type = "redirectAction"),
	})
	public String incluirLote() throws Exception {
		controleServico.salvar(getLote());
		addActionMessage(getText("lote.cadastrado.sucesso"));
		return SUCCESS;
	}

	@Action(value = "abrirAlterarLote", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CONTROLE_CADASTRAR_ESTOQUE + "/alterarLote.jsp")
	})
	public String abrirAlterarLote() throws Exception {
		return SUCCESS;
	}

	@Action(value = "confirmarAlteracaoLote", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CONTROLE_CADASTRAR_ESTOQUE + "/confirmarAlteracaoLote.jsp") 
	})
	public String confirmarAlteracaoLote() throws Exception {
		return SUCCESS;
	}

	@Action(value = "alterarLote", results = {
		@Result(name = SUCCESS, params = {"actionName", "estoque"}, type = "redirectAction"),
		@Result(name = FORWARD_NOTIFICACAO, params = {
			"actionName", "notificacoes", 
			"namespace", "/notificarProdutos"
		}, type = "redirectAction")
	})
	public String alterarLote() throws Exception {
		addActionMessage(getText("lote.alterado.sucesso"));

		if (getOrigem().equals("notificacao")) {
			return FORWARD_NOTIFICACAO;
		}
		
		controleServico.alterar(getLote());
		return SUCCESS;
	}

	@Action(value = "finalizar", results = {
		@Result(name = SUCCESS, params = {"actionName", "pesquisar", "namespace", "/pesquisarProduto"}, type = "redirectAction"),
	})
	public String finalizar() throws Exception {
		addActionMessage(getText("estoque.finalizado.mensagem.sucesso"));
		return SUCCESS;
	}

	@Action(value = "cancelar", results = {
		@Result(name = SUCCESS, params = {"actionName", "pesquisar", "namespace", "/pesquisarProduto"}, type = "redirectAction"),
	})
	public String cancelar() throws Exception {
		addActionMessage(getText("estoque.cancelado.mensagem.sucesso"));
		return SUCCESS;
	}

	public String getOrigem() {
		return origem;
	}

	public void setOrigem(String origem) {
		this.origem = origem;
	}

	public Estoque getEstoque() {
		return estoque;
	}

	public void setEstoque(Estoque estoque) {
		this.estoque = estoque;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Lote getLote() {
		return lote;
	}

	public void setLote(Lote lote) {
		this.lote = lote;
	}

	public ControleServico getControleServico() {
		return controleServico;
	}

	public void setControleServico(ControleServico controleServico) {
		this.controleServico = controleServico;
	}

	public List<Lote> getLotes() {
		return lotes;
	}

	public void setLotes(List<Lote> lotes) {
		this.lotes = lotes;
	}
}
